home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagd_f.zip / DATATYPE.SWG / 0022_Card Shuffling 2 + Display!.pas < prev    next >
Pascal/Delphi Source File  |  1995-03-03  |  4KB  |  174 lines

  1. {
  2. > I am writing a Card game in TP 7 and have run into a problem.
  3. > I need to generate a random order of numbers (Cards) 1 to 52
  4. > without any duplicates, and with so speed. I have tried useing
  5. > ramdom(52). Checking for #0 and for Duplicate numbers takes alot
  6. > of time.
  7. > Does anyone have any ideas how to do this quickly?
  8.  
  9. I rewrote the routine for one of my doors that I'm writing, and came up
  10. with this, (note I've removed my jsdoor procedures in place of CRT's)
  11. }
  12.  
  13. {$X+}
  14. uses crt;
  15. { Globals for the draw card }
  16. const
  17.   backside = 0;
  18.   hearts   = 1;
  19.   diamonds = 2;
  20.   spades   = 3;
  21.   clubs    = 4;
  22.   low      = 1;
  23.   high     = 2;
  24.   maxcards = 52;
  25. type
  26.   card = record
  27.     suit,value: byte;
  28.   end;
  29.   cardstype = array[1..maxcards] of card;
  30. Const
  31.   backcard : card = (suit:0;value:0);
  32.  
  33. Function FSpace(num: word): string;{ Following space }
  34. var temp: string;
  35. begin
  36.   str(num,temp);
  37.   if length(temp) < 2 then temp := temp + ' ';
  38.   fspace := temp;
  39. end;
  40.  
  41. Function PSpace(num: word): string;{ Prior space }
  42. var temp: string;
  43. begin
  44.   str(num,temp);
  45.   if length(temp) < 2 then temp := ' ' + temp;
  46.   pspace := temp;
  47. end;
  48.  
  49. Procedure Drawcard(thecard: card);
  50. { To draw a card for High, low or to draw a card for blackjack }
  51. var
  52.   picture: char;
  53.   first,second: string;
  54. begin
  55.   with thecard do
  56.   if suit = backside then begin
  57.     textattr := blue shl 4+yellow;
  58.     write('░░░░░');
  59.     gotoxy(wherex-5,wherey+1);
  60.     write('░░░░░');
  61.     gotoxy(wherex-5,wherey+1);
  62.     write('░░░░░');
  63.   end
  64.   else begin
  65.     case suit of
  66.       hearts: begin
  67.         picture := #3;
  68.         textattr := lightgray shl 4+red;
  69.       end;
  70.       diamonds: begin
  71.         picture := #4;
  72.         textattr := lightgray shl 4+red;
  73.       end;
  74.       spades: begin
  75.         picture := #6;
  76.         textattr := lightgray shl 4+black
  77.       end;
  78.       clubs: begin
  79.         picture := #5;
  80.         textattr := lightgray shl 4+black
  81.       end;
  82.     end;
  83.     case value of
  84.       1: begin
  85.         first := 'A ';
  86.         second := ' A';
  87.       end;
  88.       2..10: begin
  89.         first := FSpace(value);
  90.         second := PSpace(value);
  91.       end;
  92.       11: begin
  93.         first := 'J ';
  94.         second := ' J';
  95.       end;
  96.       12: begin
  97.         first := 'Q ';
  98.         second := ' Q';
  99.       end;
  100.       13: begin
  101.         first := 'K ';
  102.         second := ' K';
  103.       end;
  104.     end;
  105.     if value <> 14 then begin
  106.       write(first+'  '+picture);
  107.       gotoxy(wherex-5,wherey+1);
  108.       write('  '+picture+'  ');
  109.       gotoxy(wherex-5,wherey+1);
  110.       write(picture+'  '+second);
  111.     end
  112.     else begin
  113.       write('Joker');
  114.       gotoxy(wherex-5,wherey+1);
  115.       write(#25' '#5); { Five spaces }
  116.       gotoxy(wherex-5,wherey+1);
  117.       write('Joker');
  118.     end;
  119.   end;
  120.   textattr := lightgray;
  121. end;
  122.  
  123. Procedure ShuffleCards(var cards: cardstype);
  124. Procedure Swapcard(var card1, card2: card);
  125. var dummy: card;
  126. begin
  127.   dummy := card1;
  128.   card1 := card2;
  129.   card2 := dummy;
  130. end; { End Swapcard }
  131. var i: byte;
  132. begin
  133.   for i := 1 to maxcards do swapcard(cards[i],cards[random(maxcards)+1]);
  134. end; { End Shufflecards }
  135.  
  136. Procedure SetupDeck(var cards: cardstype);
  137. var i,j: byte;
  138. begin
  139.   for i := 1 to 4 do
  140.     for j := 1 to 13 do begin
  141.       cards[(I-1)*13+j].value := j;
  142.       cards[(I-1)*13+j].suit := i;
  143.     end;
  144. end;
  145.  
  146. Procedure Drawcards(cards: cardstype);
  147. var i,j: byte;
  148. begin
  149.   for i := 1 to 4 do
  150.     for j := 1 to 13 do begin
  151.       gotoxy((j-1)*6+1,(i-1)*4+1);
  152.       drawcard(cards[(i-1)*13+j]);
  153.     end;
  154. end;
  155.  
  156. Var
  157.   cards: cardstype;
  158. begin
  159.   randomize;
  160.   { Init all the cards to face down }
  161.   fillchar(cards,sizeof(cards),0);
  162.   clrscr;
  163.   drawcards(cards);
  164.   readkey;
  165.   Setupdeck(cards);
  166.   drawcards(cards);
  167.   readkey;
  168.   Shufflecards(cards);
  169.   drawcards(cards);
  170.   readkey;
  171. End.
  172.  
  173.  
  174.